home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / utility / cachchk5.zip / CACHECHK.DOC next >
Text File  |  1996-10-07  |  18KB  |  354 lines

  1.         CACHECHK 
  2.         v5 10/6/96
  3.     Copyright (c) 1995-96 by Ray Van Tassle.
  4.  
  5.     This is NOT freeware.  This is postcard-ware.  Send me a nice
  6.     picture post card as the registration fee.
  7.     But if you want to, or if this has been VERY valuable to you, a
  8.     money contribution will be gratefully accepted.  You decide if
  9.     you should send money, and how much.  How could I be any more fair??
  10.     Ray Van Tassle
  11.     1020 Fox Run Lane
  12.     Algonquin, Il. 60102 USA
  13.     (708)658-4941
  14.  
  15.  
  16. CACHECHK performs memory access timing tests, to see if you have a 
  17. cache, how many caches, and to check the access speed.
  18. It will also tell you if any of the memory isn't cached, and if any
  19. of the memory is significantly slower that the rest.
  20.  
  21. SAMPLE COMMAND LINES:
  22.     To log information to a file, for posting or printing---
  23.     >del mycpu.log    
  24.     >cachechk My 486, OPTI chipset >>mycpu.log
  25.     >cachechk -w My 486, memory write >>mycpu.log
  26.     >cachechk -f My 486, with cache disabled >>mycpu.log
  27.  
  28.  
  29. There are two kinds of caches,  the on-chip cache (level one, or L1) 
  30. which is in the CPU processor chip, and off-chip cache (level two, or 
  31. L2) which is on the motherboard.
  32.  
  33. Some 386 motherboards have 64KB of off-chip cache.
  34. Some CYRIX 386/486 chips have a very small L1 cache.
  35. Most 486's have an on-chip cache, and most new motherboards also have a L2 
  36. cache.
  37. The Intel 486DX2/66 has 8KB of L1 cache.
  38. The Intel 486DX4/100 has 16KB of L1 cache.
  39. The AMD 486DX4/100 has 8KB of L1 cache.
  40. Intel Pentium has 16KB of L1 cache, 8KB for data and 8KB for code.
  41.  
  42. The typical 486 MB has 256KB of L2 cache, although many will let you 
  43. install 512KB or even 1MB.
  44.   
  45. Q: HOW MUCH CACHE DO I NEED?
  46. For a 486, get a 256K cache.
  47. All the writeups that I have seen say:
  48.     64KB cache gets a LOT of improvement.
  49.     128KB gets a bit more.
  50.     256KB gets a teeny bit more.
  51.     512KB gets only a teensy weensy bit more.
  52. (Note: these are for DOS and WINDOWS3.  A real OS, like LINUX, OS/2, 
  53. and perhaps WIN-95 and WIN-NT may be different.)
  54. In general, this seems to be the way all caches work---the first bit 
  55. gets a lot of bang, and each additional bit gives smaller and smaller 
  56. improvements.
  57. It is claimed that, as long as you have a decent L2 cache, that an
  58. AMD 486/100 (with an 8k L1) is virtually identical in performance to an
  59. Intel 486/100 (with a 16K L1).
  60.  
  61. At the time this was written......
  62. 256K often uses 8-(32K x 8) SRAM chips (8 * 32K = 256KB), in two banks,
  63. and the MB can interleave accesses to the two banks.
  64. 512K often uses 4-(128K x 8) SRAM chips (4 * 128K = 512KB, but this is only 
  65. one bank, so the access time is slower, because the MB can't do bank 
  66. interleaving.
  67. Whether the cache is in one bank or two, depends upon details of the 
  68. motherboard design, and the chips available at the time.  This is expected
  69. to change in the future, as different SRAM configurations enter the market.
  70. Note the careful use of the word "can"; a particular MB might _not_ do
  71. interleaving, een though it could.  Also, depending on the exact MB design,
  72. the interleaving may or may not be done properly (in the sense of attaining
  73. the benefits).
  74.  
  75. Basically, 512K costs a LOT more than 256K and gives only a marginal
  76. improvement in performance, so stick with 256K.
  77.  
  78. Q: Why does my main memory show faster with the cache enabled, even
  79. out beyond the cache size?
  80. A: The L1 cache (on a 486) is filled in granularity of 16 bytes (this
  81. is the "cache line size").  When you read a byte, all 16 bytes of that
  82. line are read into the cache, in 4 quadbyte (32 bit) units.  The quadbyte
  83. which is addressed is read from memory first, put into the cache, and
  84. transferred to the CPU.  Then the other 3 quadbytes are read into the cache.
  85. So, if you are accessing the memory in sequential order (like CACHECHK does),
  86. the next bytes have been (or are being) automatically sucked into the cache,
  87. a "read-ahead", if you will.
  88. If the cache is disabled, this read-ahead does not take place.
  89.  
  90. Q: Why is my main RAM memory faster on writing than reading?
  91. A: I don't know.  If somebody can explain it to me, I'll put it in.
  92.  
  93. Q: How much are the timings dependent on sheer CPU speed, as opposed
  94. to the actual memory access speed?
  95. A: Probably not very much.  There is some loop control overhead in the
  96. timing loop, but it is minimal.  Each different data point is executed
  97. for approximately the same length of time (1/2 second). So the 1kb block size
  98. loops for 16 more times than the 16kb block size.  So the loop overhead is
  99. 16 times greater.  But the times are constant (10 us/kb in my system).  If the
  100. instruction overhead was significant, I would expect to see a "tilt" in the
  101. numbers.  But I don't, so it's not.
  102. And remember, the goal of CACHECHK is to
  103. measure the detectible timing improvements of the caching, and not to
  104. measure the raw cpu power.
  105.  
  106.  
  107. Q: How does it measure the CPU speed?
  108. A: By measuring how long it takes to do a particular instruction
  109. 1000 times.
  110.  
  111. Q: No matter how I set the write cache policy (copy-back or write-through),
  112. CACHECHK reports the same speed.  Isn't copy-back (AKA write-back)
  113. supposed to be better?  What gives?
  114. A: It *is* better, but only when reads and writes are intermixed.  By 
  115. design, CACHECHK does not intermix operations.  It either reads in a
  116. sustained burst, or writes in a sustained burst, so the write policy never comes
  117. into play.  CACHECHK is designed to saturate the memory read/write channel and
  118. to report the timings in this condition.  In fact, in order to be able to
  119. detect and time the various stages of the memory system, it is absolutely
  120. necessary to throw as much cr*p at it as it can possibly handle.
  121.  
  122. ===================================================================
  123. CACHECHK will run the access tests using all the memory in your 
  124. machine, so that you can check to make sure that all the memory is 
  125. cached.
  126.  
  127.  
  128. Usage: CACHECHK -tn -4hfnvwqz? [Optional comments]
  129. Cache memory detector & timer.  Runs only on 80386 (or better) CPU.
  130.     -4  = Override CPU check, treat this as a 486.
  131.     -h? = Print this help text.
  132.     -f  = Perform tests with cache disabled.
  133.     -q  = Quick. Faster but not as accurate.
  134.     -qq = Each 'q' is 2 times quicker. But less accurate.
  135.     -tn = Top of memory to test. n = nth MB
  136.     -v  = Verbose.  -vv = positively chatty!
  137.     -xN = Extra tests. N is bitmapped number.  "-x7" does all three
  138.       1 =   --write.
  139.       2 =   --read with cache off.
  140.       4 =   --read with byte offsets.
  141.     -w  = Do memory write (otherwise memory read).
  142.     -z  = Slower.  Like q, but the other direction.
  143.           Probably won't be needed on anything less than a 786DX4/200.
  144.  
  145. The "optional comments" just get logged, so you can identify test information
  146. along with the results.  Mostly useful if you redirect the output to
  147. a file. For example:
  148.     cachechk -q Test with bios set to 1 wait state >before.dat
  149.  
  150. The basic timing loop is 1/2 second per size.  Each 'q' cuts the time 
  151. in half.  Each 'z' doubles the time.  If the timing figures aren't 
  152. steady, you probably have too many q's.
  153.  
  154. You can run the tests with the cache disabled, with the 'f' option (on 
  155. a 486 or Pentium).  Naturally, it is re-enabled again when it's done.
  156. This generally turns off BOTH the L1 and L2 cache.  Your bios setup 
  157. may (or may not) let you individually enable/disable the caches.
  158.  
  159. Times cache & memory access, and figures out cache size(s).
  160. Results are in:
  161.    microseconds per KB, MB per seconds, and nanoseconds per byte.
  162.  
  163. Memory is access in quadbytes, in flat 32-bit protected mode. For base 
  164. memory (first MB, MB#0) only 640KB is accessed. Memory accesses are in 
  165. various block sizes, from 1KB to 2MB. Each megabyte is tested starting 
  166. at the beginning of that megabyte.  CACHECHK will work under a memory 
  167. manager (HIMEM, EMM386, QEMM, Windows, etc.), but the results may be 
  168. inaccurate, the machine might crash, and it won't be able to test all 
  169. of the memory. It will run under WINDOWS, but results are wildly 
  170. inaccurate. For best results, boot clean--on DOS 6 & above, hit F5 
  171. while it boots.
  172.  
  173. It will NOT touch extended memory that is already allocated or in use.
  174. If you have a memory manager installed, it usually occupies the first
  175. portion of the 2nd megabyte, so CACHECHK will not be able to check that.
  176.  
  177.  
  178. SOME TIMINGS I HAVE TAKEN
  179.  
  180. CPU    L1    L1speed    L2    L2speed    Mem    Speeds    (taken from the
  181. type    siz    ns/byte    size    ns/byt    ns/byt    µsec/KB    printout)
  182. ------    ----    -------    ----    ------    ------    ----------
  183. 386/25SL  0    n/a     64k    80.2    108    84.....114    (Laptop)
  184. 386/25      0    n/a     64k    59.2    90    62......94    (Desktop)
  185. 486/33      8k    30.7    128k    43.6    70    31..45..73    (Intel)
  186. 486/66      8k    16.1    0    n/a    50    15......52    (Intel)
  187. 486/100      8k    11.1    0    n/a    46    10......48    (AMD)
  188. 486/100     16k    10.0    256k    18.8    26    10..19..27    (Intel)
  189. P-75      8k    10.2    256k    16.4    24    10..17..24
  190.  
  191.  
  192. Timer
  193. -----
  194. CACHECHK directly accesses the timer chip to get a high-precision timer
  195. (0.838 microsec resolution).  In some motherboards (notibly reported
  196. to be "UMC with fake cache chips"), there is a problem with this timer.
  197. I worked around this in version 2, but there may be some boards where my
  198. work-around still doesn't work.
  199.  
  200.  
  201. Cache basics
  202. ------------
  203. The CPU cache is generally organized in "lines" of 16 bytes.  An access
  204. to any byte which is not in the cache causes a "cache line fill" operation,
  205. which reads in the entire 16 byte chunk.
  206. On a 486, memory is 4 bytes wide (32 bits).  Using burst-mode, the CPU
  207. reads four 32-bit chunks.  The numbers you sometimes see, such as 3-2-2-2
  208. or 2-1-1-1, refer to the number of clock cycles to read these chunks.  The
  209. first one takes longer because of setup time.
  210. The 486 CPU can do "out-of-order line fill".  If you access the 4th chunk,
  211. the memory system will read that chunk in first, pass the addressed bytes
  212. to the CPU, then read in the other 3 chunks.
  213.  
  214. The L1 cache is on the CPU itself (AKA on-chip cache), and is usually
  215. 4-way set associative.  This means that a line can go into any one of four
  216. different places in the cache, using an LRU (least-recently-used) algorithm.
  217. The L2 cache is on the motherboard.  Almost always these are direct-mapped
  218. (or "1-way").  This means that a line can go into just one place in the cache.
  219. Four-way set associative is better.  Actually, the more "ways", the better.
  220. Also, more expensive.  "Fully associative" is the absolute best.  The Cyrix
  221. 686 has a small (256 byte) fully-associative instruction-line cache (for
  222. instructions only), and a 16KB 4-way set associative cache.  The Pentium
  223. has 8KB for instructions and 8KB for data, totalling 16K.
  224.  
  225. The other terms you hear are "write-back" (AKA "copy-back"), and
  226. "write-through".  In write-through, when the CPU changes a byte in memory,
  227. it first writes it into the cache, then that cache line is written to
  228. the RAM.  In write-back, when the CPU changes a byte in memory, it writes
  229. it into the cache, and sets the "dirty-bit" for that cache line.  Later
  230. on, when some other piece of RAM needs to be put in the cache, the memory
  231. system will notice that the line is "dirty", and write it to RAM, before
  232. reading the new data into the cache line.
  233. Write-back is better.
  234. Most motherboards have write-back L2 cache.
  235. The Cyrix CPUs, and the "enhanced" AMD and Intel CPUs have write-back 
  236. L1 cache.  Other AMD and Intel cpus have write-through cache.
  237. Very advanced CPUs and motherboards do other tricks in the write-back stage.
  238. Instead of writing the cache line to RAM, then reading the new data into
  239. the cache, it will move the data from the cache into a write-buffer, then
  240. do the read, then finally write into RAM when there is no read activity.
  241. More of these write buffers will give the memory system more chances to delay
  242. a write cycle in favor of a read cycle.
  243. Again, depending on the exact MB design,
  244. the write-back may or may not be done properly (in the sense of attaining
  245. the benefits).
  246.  
  247. Motherboard Specsmanship
  248. ------------------------
  249. Back in the early days of transistor radios, one selling point was how
  250. many transistors a radio had.  Some manufacturers (especially Korean and
  251. Japanese) would incorporate non-functional transistors, just to be able
  252. to be able to (legitimately) claim a higher count.
  253. The same thing is possible with MB designs.  A "write-back" design without
  254. a dirty-tag-ram, or without posted write buffers, will not perform much
  255. (or any!) better than a write-through.  Ditto for interleaving.
  256.  
  257. Further Reading
  258. ---------------
  259. I have reluctantly provided more technical detail above that I had originally
  260. planned.  However, it's by no means a complete discussion.
  261. Refer to the pc hardware FAQ (PCHWFAQ, filename PCFAQnnn.ZIP) for much
  262. more detailed information.
  263.  
  264. Interpreting the printout
  265. -------------------------
  266.  
  267. CACHECHK v3beta2 11/11/95  Copyright (c) 1995 by Ray Van Tassle. (-h for help)
  268. ****** WARNING *******
  269.     CPU is in V86 mode!    Timings may not be accurate!
  270. CMOS reports: conv_mem= 640K, ext_mem= 15,360K, Total RAM= 16,000K
  271. ### This is the memory size, as listed in the CMOS (via setup)
  272.  
  273. "GenuineIntel" 486DX4 100 MHz
  274. ### The cpu type & speed.  Advanced CPUs will identify themselves. For
  275. ### others, the type is derived.
  276. ### The speed is determined by instruction timing, and is fairly accurate
  277. ### (plus/minus 3 mhz) from 386/16 to P5/120.
  278. ### HOWEVER, some of the new superfast CPU's (Cyrix 6x86, Pentium Pro, etc.)
  279. ### are just so blazingly fast that it is very difficult to calibrate
  280. ### the timing loop, so the reported speed may be wrong (e.q., reporting
  281. ### a 100MHZ Cyrix as 1400 Mhz.
  282.  
  283. Reading from memory.  
  284. MegaByte#:      --------- Memory Access Block sizes (KB)-----
  285.        1    2    4    8   16   32   64  128  256  512 1024 2048 4096 <-- KB
  286.  0:   11   11   11   11   11   20   20   20   20   28   --   --   --    µs/KB
  287. ### "n:" is the megabyte number. 0 = base memory, 1 = 2nd MB, etc.
  288. ### The numbers are how many microseconds it takes to read/write a certain
  289. ### number of bytes.
  290. ### We can see that 1KB through 16KB takes 11us/KB, 32KB through 256KB takes
  291. ### 20us/KB, and 512 KB takes 28us/KB.  This is the base memory, so we can't
  292. ### go beyond 640KB. So we stop at 512KB.
  293. ### The "--" (for blocks of 1MB, 2MB, and 4MB) means that blocks of this size
  294. ### were not tested (because they could not be).
  295. ### I go up to 4MB, because some lucky folks have 1MB of cache, and if I 
  296. ### stopped at a 2MB block, there is only one data point of RAM speed.
  297.  
  298.  2:   11   11   11   11   11   20   20   20   20   28   28   28   28    µs/KB
  299. ### Megabyte #1 is skipped here.  Because I have a memory manager (QEMM)
  300. ### loaded.  It occupies some of the memory at the beginning of MB#1, therefore
  301. ### this MB cannot be allocated, therefore I don't test it.
  302. ### However, I can check a blocksize of 4MB.  This means that it reads from
  303. ### address 0x0200000 through 0x05fffff.
  304. ### We now have 4 data-points of actual RAM speed.
  305. ### By inspection, we see that there are two breakpoints in the memory
  306. ### access speed.  The first at 16kb, the second at 256kb.  This is as it
  307. ### should be, as this is an Intel 486/100 (with 16kb of L1 cache), and 256kb
  308. ### of L2 cache on the motherboard.  An AMD 486/100 has 8KB of L1 cache.
  309. ### A Pentium has 8kb data cache and 8kb of instruction cache.
  310. ### CACHECHK only tests data, so P5's will show 8kb of L1 cache.
  311.  
  312.  3  4  5  6  7  8  9  <--- same as above.
  313. ### The speeds of megabyte 2 thru megabyte 9 are all the same.
  314. ### Actually, this is a small fib.  Since mb#9 is the last full mb being
  315. ### tested, we clearly can't be using block sizes of 2MB or 4MB.  And for
  316. ### mb#8, we can't use block size of 4MB.  Those entries actually have
  317. ### "--".  But the numbers which *are* there are the same.
  318.  
  319.  This machine seems to have both L1 and L2 cache. [read]
  320. ### This is reading.  Writing will say ["write]".
  321.     L1 cache is  16KB -- 103.3 MB/s  10.2 ns/byte  (262%) (186%)   3.9 clks
  322.     L2 cache is 256KB --  55.3 MB/s  19.0 ns/byte  (140%) (100%)   7.2 clks
  323.     Main memory speed --  39.3 MB/s  26.7 ns/byte  (100%) [read]  10.2 clks
  324.     L1 cache is  16KB --    102.8 MB/s  10.2 ns/byte  (261%)  (185%)
  325.     L2 cache is 256KB --     55.3 MB/s  19.0 ns/byte  (140%)  (100%)
  326.     Main memory speed --     39.3 MB/s  26.7 ns/byte  (100%) [read]
  327. ### The L1 cache is 262% (two and a half times) faster than RAM.
  328. ### The L2 cache is 140% (one and a half times) faster than RAM.
  329. ### The L1 cache is 186% faster (almost twice as fast) as the L2 cache.
  330. ### It takes an average of 3.9 clock cycles to read a 32-bit longword from
  331. ### the L1 cache into a 32-bit register, 7.2 cycles from L2, and 10.2 from RAM.
  332.  
  333.     Effective read RAM access time is 106ns (a RAM bank is 4 bytes wide). 
  334. ### This is the *measured* access speed of the RAM.  On a 486, this
  335. ### is 4 times the "main memory speed" (above example is 4 * 26.7), because
  336. ### a 486 has a 32-bit (4 byte) path between RAM and the CPU.  For a P5,
  337. ### this will be 8 times, because the P5 has a 64-bit (8 byte) path.
  338. ### Note that this is NOT the speed of your RAM chips---it is the measure of
  339. ### how fast your RAM is being driven.  
  340. ###
  341. ### This is VERY dependent on the "DRAM Burst Cycle" settings in your BIOS
  342. ### setup.  This computer has an AMI bios, where I can set it to certain
  343. ### values.  The fastest it will allow is 3-2-2-2.  The slowest
  344. ### it will allow is 5-4-4-4.  With this slow setting, I get:
  345. ###    Main memory speed --     24.9 MB/s  42.1 ns/byte  (100%) [read]
  346. ###    Effective read RAM access time is 168ns (a RAM bank is 4 bytes wide). 
  347. ### This is much slower, BUT it might let me use slower (i.e., cheaper) RAM
  348. ### chips.
  349. ### Note that *many* motherboards will NOT let you fiddle with these settings.
  350. ### The 486 (and Pentium) always fill the entire cache line (16 bytes), so
  351. ### it is NOT possible to get just one byte from the memory; it always
  352. ### grabs all 16 bytes in that block.
  353.  
  354.